{ "nbformat": 4, "nbformat_minor": 0, "metadata": { "colab": { "name": "Decision trees machine learning with SKLearn.ipynb", "provenance": [] }, "kernelspec": { "name": "python3", "display_name": "Python 3" }, "language_info": { "name": "python" }, "pycharm": { "stem_cell": { "cell_type": "raw", "source": [], "metadata": { "collapsed": false } } } }, "cells": [ { "cell_type": "markdown", "source": [ "# Machine learning with decision trees\n", "\n", "## Try me\n", " [![Open In Colab](../../_static/colabs_badge.png)](https://colab.research.google.com/github/ffraile/operations-research-notebooks/blob/main/docs/source/Decision%20Theory/tutorials/Decision_trees_machine_learning_with_SKLearn.ipynb)[![Binder](../../_static/binder_badge.png)](https://mybinder.org/v2/gh/ffraile/operations-research-notebooks/main?labpath=docs%2Fsource%2FDecision%20Theory%2Ftutorials%2FDecision_trees_machine_learning_with_SKLearn.ipynb)\n", "\n", "In this notebook we are going to train a decision tree to solve a classification problem in Python.\n", "\n", "## Problem definition\n", "The goal is to train a model to get the category of a wine according to a set of physicochemical properties (e.g. alcohol percentage, color intensity and hue, or flavonoids).\n", "Imagine that the categories have been assigned by our customers on a given number of wines (e.g. they have determined which wines that are awesome, which wines are ok, or which ones are only drinkable). Then, with such a model, given a new wine, we could predict its category based on the physicochemical properties of the wine provided by a physicochemical test.\n", "\n", "The objective is then to train a model to predict the category of the wine based on 13 different properties of wine. \n", "\n", "## Load data\n", "We are going to use a dataset provided by [SKlearn](https://scikit-learn.org/stable/datasets/toy_dataset.html). The dataset contains 177 samples of physicochemical properties of different types of wines, classified into three different classes, class 1, class 2, and class 3.\n", "\n", "The dataset in SKLearn is loaded with the function ```load_wine```. The object returned contains the following properties:\n", "\n", "- ```data```: A 2D Numpy array where each row is a different physicochemical test performed over a different wine (that is, each row represents the properties of a wine) and each column contains the data of a specific property. \n", "- ```target```: A 1D Numpy (column vector) array where each row represents the category of the corresponding wine\n", "- ```feature_names```: The names of the columns in ```data```\n", "- ```target_names```: The names of the wine categories\n", "\n", "You can check the [docs](https://scikit-learn.org/stable/modules/generated/sklearn.datasets.load_wine.html) for further details. \n", "\n", "Let's load the data into a Pandas dataframe so that we can explore its properties:" ], "metadata": { "id": "zho6lTBTkg9Y" } }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 423 }, "id": "GxWwXokh3sj3", "outputId": "fed0024c-da18-45bc-ca87-e267d25e011f" }, "outputs": [ { "output_type": "display_data", "data": { "text/plain": [ " alcohol malic_acid ash alcalinity_of_ash magnesium total_phenols \\\n", "0 14.23 1.71 2.43 15.6 127.0 2.80 \n", "1 13.20 1.78 2.14 11.2 100.0 2.65 \n", "2 13.16 2.36 2.67 18.6 101.0 2.80 \n", "3 14.37 1.95 2.50 16.8 113.0 3.85 \n", "4 13.24 2.59 2.87 21.0 118.0 2.80 \n", ".. ... ... ... ... ... ... \n", "173 13.71 5.65 2.45 20.5 95.0 1.68 \n", "174 13.40 3.91 2.48 23.0 102.0 1.80 \n", "175 13.27 4.28 2.26 20.0 120.0 1.59 \n", "176 13.17 2.59 2.37 20.0 120.0 1.65 \n", "177 14.13 4.10 2.74 24.5 96.0 2.05 \n", "\n", " flavanoids nonflavanoid_phenols proanthocyanins color_intensity hue \\\n", "0 3.06 0.28 2.29 5.64 1.04 \n", "1 2.76 0.26 1.28 4.38 1.05 \n", "2 3.24 0.30 2.81 5.68 1.03 \n", "3 3.49 0.24 2.18 7.80 0.86 \n", "4 2.69 0.39 1.82 4.32 1.04 \n", ".. ... ... ... ... ... \n", "173 0.61 0.52 1.06 7.70 0.64 \n", "174 0.75 0.43 1.41 7.30 0.70 \n", "175 0.69 0.43 1.35 10.20 0.59 \n", "176 0.68 0.53 1.46 9.30 0.60 \n", "177 0.76 0.56 1.35 9.20 0.61 \n", "\n", " od280/od315_of_diluted_wines proline \n", "0 3.92 1065.0 \n", "1 3.40 1050.0 \n", "2 3.17 1185.0 \n", "3 3.45 1480.0 \n", "4 2.93 735.0 \n", ".. ... ... \n", "173 1.74 740.0 \n", "174 1.56 750.0 \n", "175 1.56 835.0 \n", "176 1.62 840.0 \n", "177 1.60 560.0 \n", "\n", "[178 rows x 13 columns]" ], "text/html": [ "\n", "
\n", "
\n", "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
alcoholmalic_acidashalcalinity_of_ashmagnesiumtotal_phenolsflavanoidsnonflavanoid_phenolsproanthocyaninscolor_intensityhueod280/od315_of_diluted_winesproline
014.231.712.4315.6127.02.803.060.282.295.641.043.921065.0
113.201.782.1411.2100.02.652.760.261.284.381.053.401050.0
213.162.362.6718.6101.02.803.240.302.815.681.033.171185.0
314.371.952.5016.8113.03.853.490.242.187.800.863.451480.0
413.242.592.8721.0118.02.802.690.391.824.321.042.93735.0
..........................................
17313.715.652.4520.595.01.680.610.521.067.700.641.74740.0
17413.403.912.4823.0102.01.800.750.431.417.300.701.56750.0
17513.274.282.2620.0120.01.590.690.431.3510.200.591.56835.0
17613.172.592.3720.0120.01.650.680.531.469.300.601.62840.0
17714.134.102.7424.596.02.050.760.561.359.200.611.60560.0
\n", "

178 rows × 13 columns

\n", "
\n", " \n", " \n", " \n", "\n", " \n", "
\n", "
\n", " " ] }, "metadata": {} } ], "source": [ "from sklearn.datasets import load_iris, load_wine\n", "import pandas as pd\n", "\n", "# Load the wine dataset\n", "wine_data = load_wine()\n", "# Let's create a dataframe to explore the data\n", "df_wine = pd.DataFrame(wine_data.data, columns=wine_data.feature_names)\n", "display(df_wine)\n" ] }, { "cell_type": "markdown", "source": [ "## Understanding the data\n", "Now, let us explore the data so that we understand the dataset better. First, we use the ```describe()``` method of the pandas dataframe to show some statistics of each class:" ], "metadata": { "id": "nHi4t62CnKmp" } }, { "cell_type": "code", "source": [ "from IPython.core.display import Markdown\n", "target_classes = range(0, 3)\n", "\n", "# For each class\n", "for target_class in target_classes:\n", " # Show some markdown to introduce the table\n", " display(Markdown('### ' + wine_data.target_names[target_class]))\n", " display(Markdown('Find below the statitiscal details of the physicochemical properties of the class'))\n", " \n", " # Mask the rows of the class\n", " class_mask = wine_data.target == target_class\n", " class_df = df_wine.iloc[class_mask]\n", " \n", " # Display the resulting dataframe\n", " display(class_df.describe())" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 1000 }, "id": "gUu7S882ne3Y", "outputId": "e6eb83c7-a049-4ca8-8733-2c2b20d8c3fe" }, "execution_count": null, "outputs": [ { "output_type": "display_data", "data": { "text/plain": [ "" ], "text/markdown": "###class_0" }, "metadata": {} }, { "output_type": "display_data", "data": { "text/plain": [ "" ], "text/markdown": "Find below the statitiscal details of the physicochemical properties of the class" }, "metadata": {} }, { "output_type": "display_data", "data": { "text/plain": [ " alcohol malic_acid ash alcalinity_of_ash magnesium \\\n", "count 59.000000 59.000000 59.000000 59.000000 59.000000 \n", "mean 13.744746 2.010678 2.455593 17.037288 106.338983 \n", "std 0.462125 0.688549 0.227166 2.546322 10.498949 \n", "min 12.850000 1.350000 2.040000 11.200000 89.000000 \n", "25% 13.400000 1.665000 2.295000 16.000000 98.000000 \n", "50% 13.750000 1.770000 2.440000 16.800000 104.000000 \n", "75% 14.100000 1.935000 2.615000 18.700000 114.000000 \n", "max 14.830000 4.040000 3.220000 25.000000 132.000000 \n", "\n", " total_phenols flavanoids nonflavanoid_phenols proanthocyanins \\\n", "count 59.000000 59.000000 59.000000 59.000000 \n", "mean 2.840169 2.982373 0.290000 1.899322 \n", "std 0.338961 0.397494 0.070049 0.412109 \n", "min 2.200000 2.190000 0.170000 1.250000 \n", "25% 2.600000 2.680000 0.255000 1.640000 \n", "50% 2.800000 2.980000 0.290000 1.870000 \n", "75% 3.000000 3.245000 0.320000 2.090000 \n", "max 3.880000 3.930000 0.500000 2.960000 \n", "\n", " color_intensity hue od280/od315_of_diluted_wines proline \n", "count 59.000000 59.000000 59.000000 59.000000 \n", "mean 5.528305 1.062034 3.157797 1115.711864 \n", "std 1.238573 0.116483 0.357077 221.520767 \n", "min 3.520000 0.820000 2.510000 680.000000 \n", "25% 4.550000 0.995000 2.870000 987.500000 \n", "50% 5.400000 1.070000 3.170000 1095.000000 \n", "75% 6.225000 1.130000 3.420000 1280.000000 \n", "max 8.900000 1.280000 4.000000 1680.000000 " ], "text/html": [ "\n", "
\n", "
\n", "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
alcoholmalic_acidashalcalinity_of_ashmagnesiumtotal_phenolsflavanoidsnonflavanoid_phenolsproanthocyaninscolor_intensityhueod280/od315_of_diluted_winesproline
count59.00000059.00000059.00000059.00000059.00000059.00000059.00000059.00000059.00000059.00000059.00000059.00000059.000000
mean13.7447462.0106782.45559317.037288106.3389832.8401692.9823730.2900001.8993225.5283051.0620343.1577971115.711864
std0.4621250.6885490.2271662.54632210.4989490.3389610.3974940.0700490.4121091.2385730.1164830.357077221.520767
min12.8500001.3500002.04000011.20000089.0000002.2000002.1900000.1700001.2500003.5200000.8200002.510000680.000000
25%13.4000001.6650002.29500016.00000098.0000002.6000002.6800000.2550001.6400004.5500000.9950002.870000987.500000
50%13.7500001.7700002.44000016.800000104.0000002.8000002.9800000.2900001.8700005.4000001.0700003.1700001095.000000
75%14.1000001.9350002.61500018.700000114.0000003.0000003.2450000.3200002.0900006.2250001.1300003.4200001280.000000
max14.8300004.0400003.22000025.000000132.0000003.8800003.9300000.5000002.9600008.9000001.2800004.0000001680.000000
\n", "
\n", " \n", " \n", " \n", "\n", " \n", "
\n", "
\n", " " ] }, "metadata": {} }, { "output_type": "display_data", "data": { "text/plain": [ "" ], "text/markdown": "###class_1" }, "metadata": {} }, { "output_type": "display_data", "data": { "text/plain": [ "" ], "text/markdown": "Find below the statitiscal details of the physicochemical properties of the class" }, "metadata": {} }, { "output_type": "display_data", "data": { "text/plain": [ " alcohol malic_acid ash alcalinity_of_ash magnesium \\\n", "count 71.000000 71.000000 71.000000 71.000000 71.000000 \n", "mean 12.278732 1.932676 2.244789 20.238028 94.549296 \n", "std 0.537964 1.015569 0.315467 3.349770 16.753497 \n", "min 11.030000 0.740000 1.360000 10.600000 70.000000 \n", "25% 11.915000 1.270000 2.000000 18.000000 85.500000 \n", "50% 12.290000 1.610000 2.240000 20.000000 88.000000 \n", "75% 12.515000 2.145000 2.420000 22.000000 99.500000 \n", "max 13.860000 5.800000 3.230000 30.000000 162.000000 \n", "\n", " total_phenols flavanoids nonflavanoid_phenols proanthocyanins \\\n", "count 71.000000 71.000000 71.000000 71.000000 \n", "mean 2.258873 2.080845 0.363662 1.630282 \n", "std 0.545361 0.705701 0.123961 0.602068 \n", "min 1.100000 0.570000 0.130000 0.410000 \n", "25% 1.895000 1.605000 0.270000 1.350000 \n", "50% 2.200000 2.030000 0.370000 1.610000 \n", "75% 2.560000 2.475000 0.430000 1.885000 \n", "max 3.520000 5.080000 0.660000 3.580000 \n", "\n", " color_intensity hue od280/od315_of_diluted_wines proline \n", "count 71.000000 71.000000 71.000000 71.000000 \n", "mean 3.086620 1.056282 2.785352 519.507042 \n", "std 0.924929 0.202937 0.496573 157.211220 \n", "min 1.280000 0.690000 1.590000 278.000000 \n", "25% 2.535000 0.925000 2.440000 406.500000 \n", "50% 2.900000 1.040000 2.830000 495.000000 \n", "75% 3.400000 1.205000 3.160000 625.000000 \n", "max 6.000000 1.710000 3.690000 985.000000 " ], "text/html": [ "\n", "
\n", "
\n", "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
alcoholmalic_acidashalcalinity_of_ashmagnesiumtotal_phenolsflavanoidsnonflavanoid_phenolsproanthocyaninscolor_intensityhueod280/od315_of_diluted_winesproline
count71.00000071.00000071.00000071.00000071.00000071.00000071.00000071.00000071.00000071.00000071.00000071.00000071.000000
mean12.2787321.9326762.24478920.23802894.5492962.2588732.0808450.3636621.6302823.0866201.0562822.785352519.507042
std0.5379641.0155690.3154673.34977016.7534970.5453610.7057010.1239610.6020680.9249290.2029370.496573157.211220
min11.0300000.7400001.36000010.60000070.0000001.1000000.5700000.1300000.4100001.2800000.6900001.590000278.000000
25%11.9150001.2700002.00000018.00000085.5000001.8950001.6050000.2700001.3500002.5350000.9250002.440000406.500000
50%12.2900001.6100002.24000020.00000088.0000002.2000002.0300000.3700001.6100002.9000001.0400002.830000495.000000
75%12.5150002.1450002.42000022.00000099.5000002.5600002.4750000.4300001.8850003.4000001.2050003.160000625.000000
max13.8600005.8000003.23000030.000000162.0000003.5200005.0800000.6600003.5800006.0000001.7100003.690000985.000000
\n", "
\n", " \n", " \n", " \n", "\n", " \n", "
\n", "
\n", " " ] }, "metadata": {} }, { "output_type": "display_data", "data": { "text/plain": [ "" ], "text/markdown": "###class_2" }, "metadata": {} }, { "output_type": "display_data", "data": { "text/plain": [ "" ], "text/markdown": "Find below the statitiscal details of the physicochemical properties of the class" }, "metadata": {} }, { "output_type": "display_data", "data": { "text/plain": [ " alcohol malic_acid ash alcalinity_of_ash magnesium \\\n", "count 48.000000 48.000000 48.000000 48.000000 48.000000 \n", "mean 13.153750 3.333750 2.437083 21.416667 99.312500 \n", "std 0.530241 1.087906 0.184690 2.258161 10.890473 \n", "min 12.200000 1.240000 2.100000 17.500000 80.000000 \n", "25% 12.805000 2.587500 2.300000 20.000000 89.750000 \n", "50% 13.165000 3.265000 2.380000 21.000000 97.000000 \n", "75% 13.505000 3.957500 2.602500 23.000000 106.000000 \n", "max 14.340000 5.650000 2.860000 27.000000 123.000000 \n", "\n", " total_phenols flavanoids nonflavanoid_phenols proanthocyanins \\\n", "count 48.000000 48.000000 48.00000 48.000000 \n", "mean 1.678750 0.781458 0.44750 1.153542 \n", "std 0.356971 0.293504 0.12414 0.408836 \n", "min 0.980000 0.340000 0.17000 0.550000 \n", "25% 1.407500 0.580000 0.39750 0.855000 \n", "50% 1.635000 0.685000 0.47000 1.105000 \n", "75% 1.807500 0.920000 0.53000 1.350000 \n", "max 2.800000 1.570000 0.63000 2.700000 \n", "\n", " color_intensity hue od280/od315_of_diluted_wines proline \n", "count 48.000000 48.000000 48.000000 48.000000 \n", "mean 7.396250 0.682708 1.683542 629.895833 \n", "std 2.310942 0.114441 0.272111 115.097043 \n", "min 3.850000 0.480000 1.270000 415.000000 \n", "25% 5.437500 0.587500 1.510000 545.000000 \n", "50% 7.550000 0.665000 1.660000 627.500000 \n", "75% 9.225000 0.752500 1.820000 695.000000 \n", "max 13.000000 0.960000 2.470000 880.000000 " ], "text/html": [ "\n", "
\n", "
\n", "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
alcoholmalic_acidashalcalinity_of_ashmagnesiumtotal_phenolsflavanoidsnonflavanoid_phenolsproanthocyaninscolor_intensityhueod280/od315_of_diluted_winesproline
count48.00000048.00000048.00000048.00000048.00000048.00000048.00000048.0000048.00000048.00000048.00000048.00000048.000000
mean13.1537503.3337502.43708321.41666799.3125001.6787500.7814580.447501.1535427.3962500.6827081.683542629.895833
std0.5302411.0879060.1846902.25816110.8904730.3569710.2935040.124140.4088362.3109420.1144410.272111115.097043
min12.2000001.2400002.10000017.50000080.0000000.9800000.3400000.170000.5500003.8500000.4800001.270000415.000000
25%12.8050002.5875002.30000020.00000089.7500001.4075000.5800000.397500.8550005.4375000.5875001.510000545.000000
50%13.1650003.2650002.38000021.00000097.0000001.6350000.6850000.470001.1050007.5500000.6650001.660000627.500000
75%13.5050003.9575002.60250023.000000106.0000001.8075000.9200000.530001.3500009.2250000.7525001.820000695.000000
max14.3400005.6500002.86000027.000000123.0000002.8000001.5700000.630002.70000013.0000000.9600002.470000880.000000
\n", "
\n", " \n", " \n", " \n", "\n", " \n", "
\n", "
\n", " " ] }, "metadata": {} } ] }, { "cell_type": "markdown", "source": [ "The statistical information is useful, but it is impossible or in most cases really hard to determine manually the rules to separate the different classes in each of the 19 properties in the data set. Just to certify this, Let's display some data using Pyplot:" ], "metadata": { "id": "pPfR06GZnuS8" } }, { "cell_type": "code", "source": [ "from matplotlib import pyplot as plt\n", "\n", "FIG_SIZE = (10, 7)\n", "# Create figure \n", "fig, axes = plt.subplots(nrows=2, ncols=2, figsize=FIG_SIZE)\n", "\n", "# Get some columns\n", "columns = ['proline', 'flavanoids', 'ash', 'malic_acid'] \n", "\n", "# Now, we define some styles and colors for the 3 target classes\n", "target_classes = range(0, 3)\n", "colors = (\"blue\", \"red\", \"green\")\n", "markers = (\"^\", \"s\", \"o\")\n", "\n", "#Let's iterate on the target classes, so that we plot the values in \n", "# of each with different colors\n", "for target_class, color, marker in zip(target_classes, colors, markers):\n", " # The color intensity is going to be the x-axis in every plot:\n", " x_data = df_wine['color_intensity'][wine_data.target == target_class]\n", " # Now Let's get 4 different columns to plot in each of the subplots\n", " for idx in range(0,4):\n", " # Get the axes in which we are going to plot our data\n", " ax = axes[idx//2][idx%2]\n", " col = columns[idx]\n", " \n", " # Let's get the data, similar as we did for the x-axis\n", " y_data = df_wine[columns[idx]][wine_data.target == target_class]\n", " \n", " # Plot the data in the corresponding subplot\n", " ax.scatter(\n", " x=x_data,\n", " y=y_data,\n", " color=color,\n", " label=f\"class {target_class}\",\n", " alpha=0.5,\n", " marker=marker,\n", " )\n", " ax.set_xlabel(\"Color intensity\")\n", " ax.set_ylabel(columns[idx])\n", " ax.legend(loc=\"upper right\")\n", " ax.grid()" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 442 }, "id": "WwrSHjmpePtz", "outputId": "6897a787-f278-47e3-9ebd-559984113f5f" }, "execution_count": null, "outputs": [ { "output_type": "display_data", "data": { "text/plain": [ "
" ], "image/png": "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\n" }, "metadata": { "needs_background": "light" } } ] }, { "cell_type": "markdown", "source": [ "In the plot, we see 4 different properties (proline, flavanoids, ash, malic acid) against the color intensity. We can see that the data is not linearly separable in any of them, and this is only 4 out of $13^2$ possible pairs of parameters, it is clear that is unfeasible to come up with some simple rules to separate the datasets easily.\n", "But can we get the decision tree to separate the data in the three classes automatically, using a decision tree? Let's find out in the following section." ], "metadata": { "id": "wS-sCBFwZVQ6" } }, { "cell_type": "markdown", "source": [ "## Training a decision tree to classify the dataset\n", "### Dividing the dataset into training and validation data\n", "The first step is to divide the dataset into the training dataset and the validation dataset. With this step, we want to ensure that we leave some portion of the dataset so that we can validate our model. \n", "In the code below, the size of the data left out to validate the model is around 30% of the available data. \n", "\n", "We use the function ```train_test_split``` to split the data between the training data set and the validation dataset. (```text_size=0.3```)." ], "metadata": { "id": "47l0U41Dt6xJ" } }, { "cell_type": "code", "source": [ "from sklearn.model_selection import train_test_split\n", "X_train, X_test, y_train, y_test = train_test_split(wine_data.data, wine_data.target, test_size = 0.3,random_state=42)" ], "metadata": { "id": "bpKdfdOb9bF1" }, "execution_count": null, "outputs": [] }, { "cell_type": "markdown", "source": [ "Note that the ```train_test_split``` function returns four values:\n", "\n", "- ```X_train```: This Numpy array contains the features in the training data set, each row corresponds to one of the tests in the training data, and each column to a differnet feature (physicochemical property).\n", "- ```y_train```: These are the categories of the wines in the training dataset.\n", "- ```X_test```: This Numpy array contains the features in the test data set, similar to X_train.\n", "- ```y_test```: And these are the categories of the wines in the test dataset. \n", "\n", "[Here](https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.train_test_split.html?highlight=train_test_split#sklearn.model_selection.train_test_split) are the full details of the ```train_test_split``` function.\n" ], "metadata": { "id": "UMmT9AaufyjB" } }, { "cell_type": "markdown", "source": [ "## Train the model\n", "We are going to train our model, using the training data. We only need to create an instance of a ```DecisionTreeClassifier``` class, and use the class method ```fit``` passing the trainining data: " ], "metadata": { "id": "0xr9BeV7dc7b" } }, { "cell_type": "code", "source": [ "from sklearn.tree import DecisionTreeClassifier\n", "clf_model = DecisionTreeClassifier(random_state=0)\n", "clf_model.fit(X_train, y_train)" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "yMUGh8yh-TSq", "outputId": "a3e79dfe-b2a2-4d5e-c020-8b0b366cc459" }, "execution_count": null, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "DecisionTreeClassifier(random_state=0)" ] }, "metadata": {}, "execution_count": 28 } ] }, { "cell_type": "markdown", "source": [ "All the details of the DecisionTreeClassifier class can be found in [here](https://scikit-learn.org/stable/modules/generated/sklearn.tree.DecisionTreeClassifier.html?highlight=decisiontreeclassifier#sklearn.tree.DecisionTreeClassifier)." ], "metadata": { "id": "4IX6fCYonmbd" } }, { "cell_type": "markdown", "source": [ "## Validate the decision tree\n", "### Checking the accuracy\n", "Ok, once that we have trained our model, let us test its, [accuracy](https://scikit-learn.org/stable/modules/generated/sklearn.metrics.accuracy_score.html#sklearn.metrics.accuracy_score). We are going to use some built-in functions provided in SKLearn. The first one, ```accuracy_score``` computes the accuracy of a model, passing as parameters, the real categories and the predicted categories. So Let's predict the categories in the test data set and get teh accuracy score: " ], "metadata": { "id": "XU_kPyo9hGQg" } }, { "cell_type": "code", "source": [ "from sklearn.metrics import accuracy_score\n", "\n", "# Use the method predict to predict the category of the wines in the test dataset\n", "y_predict = clf_model.predict(X_test)\n", "\n", "# Calculate the accuracy with accurate_score, using the real categories in the test dataset\n", "# and the predicted categories \n", "accuracy_score(y_test,y_predict)\n" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "byGX7UAb-9kM", "outputId": "46c21807-c35c-4578-fb29-63f14ae5c5c8" }, "execution_count": null, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "0.9629629629629629" ] }, "metadata": {}, "execution_count": 29 } ] }, { "cell_type": "markdown", "source": [ "### Represent the Confusion matrix\n", "SKLearn also allow us to display the confusion matrix given a set of real categories and a set of predicted categories, with the function ```confusion_matrix``` (see docs [here](https://scikit-learn.org/stable/modules/generated/sklearn.metrics.confusion_matrix.html)), and display the confusion matrix with ```ConfusionMatrixDisplay``` (see docs [here](https://scikit-learn.org/stable/modules/generated/sklearn.metrics.ConfusionMatrixDisplay.html)):" ], "metadata": { "id": "mXT1So8euUpZ" } }, { "cell_type": "code", "source": [ "from sklearn.metrics import confusion_matrix, ConfusionMatrixDisplay\n", "from matplotlib import pyplot as plt\n", "cm = confusion_matrix(y_test, y_predict)\n", "disp = ConfusionMatrixDisplay(confusion_matrix=cm,\n", " display_labels=wine_data.target_names)\n", "disp.plot()\n", "plt.show()" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 280 }, "id": "74DNkJR9CHCR", "outputId": "1c24cfd2-af7e-451e-ffe7-9f6f28302118" }, "execution_count": null, "outputs": [ { "output_type": "display_data", "data": { "text/plain": [ "
" ], "image/png": "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\n" }, "metadata": { "needs_background": "light" } } ] }, { "cell_type": "markdown", "source": [ "### Render the decision tree\n", "Finally, Let's render the decision tree using Graphviz and the provided class method ```export_graph_viz```. \n", "Read the docs [here](https://scikit-learn.org/stable/modules/generated/sklearn.tree.export_graphviz.html)." ], "metadata": { "id": "ESEWeeQduadw" } }, { "cell_type": "code", "source": [ "from sklearn import tree\n", "import graphviz\n", "dot_data = tree.export_graphviz(clf_model,\n", " out_file=None, \n", " feature_names=wine_data.feature_names, \n", " class_names=wine_data.target_names, \n", " filled=True,\n", " label='none',\n", " leaves_parallel=True,\n", " proportion=True,\n", " rounded=True, \n", " special_characters=True) \n", "graph = graphviz.Source(dot_data) \n", "\n", "graph\n" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 787 }, "id": "cwWvBpJ-4NgD", "outputId": "113012ab-1762-497a-e2b4-3308afcc67bb" }, "execution_count": null, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "" ], "image/svg+xml": "\n\n\n\n\n\nTree\n\n\n\n0\n\ncolor_intensity ≤ 3.82\n0.658\n100.0%\n[0.323, 0.403, 0.274]\nclass_1\n\n\n\n1\n\nproline ≤ 1010.0\n0.083\n37.1%\n[0.043, 0.957, 0.0]\nclass_1\n\n\n\n0->1\n\n\nTrue\n\n\n\n6\n\nflavanoids ≤ 1.4\n0.567\n62.9%\n[0.487, 0.077, 0.436]\nclass_0\n\n\n\n0->6\n\n\nFalse\n\n\n\n2\n\nash ≤ 3.07\n0.043\n36.3%\n[0.022, 0.978, 0.0]\nclass_1\n\n\n\n1->2\n\n\n\n\n\n5\n\n0.0\n0.8%\n[1.0, 0.0, 0.0]\nclass_0\n\n\n\n1->5\n\n\n\n\n\n3\n\n0.0\n35.5%\n[0.0, 1.0, 0.0]\nclass_1\n\n\n\n2->3\n\n\n\n\n\n4\n\n0.0\n0.8%\n[1.0, 0.0, 0.0]\nclass_0\n\n\n\n2->4\n\n\n\n\n\n7\n\n0.0\n27.4%\n[0.0, 0.0, 1.0]\nclass_2\n\n\n\n6->7\n\n\n\n\n\n8\n\nproline ≤ 724.5\n0.236\n35.5%\n[0.864, 0.136, 0.0]\nclass_0\n\n\n\n6->8\n\n\n\n\n\n9\n\nmalic_acid ≤ 3.92\n0.245\n5.6%\n[0.143, 0.857, 0.0]\nclass_1\n\n\n\n8->9\n\n\n\n\n\n12\n\n0.0\n29.8%\n[1.0, 0.0, 0.0]\nclass_0\n\n\n\n8->12\n\n\n\n\n\n10\n\n0.0\n4.8%\n[0.0, 1.0, 0.0]\nclass_1\n\n\n\n9->10\n\n\n\n\n\n11\n\n0.0\n0.8%\n[1.0, 0.0, 0.0]\nclass_0\n\n\n\n9->11\n\n\n\n\n\n" }, "metadata": {}, "execution_count": 16 } ] }, { "cell_type": "markdown", "source": [ "## Testing the model\n", "You are now ready to test the model! You only need to create an array with where the Physicochemical properties are added in the right order:\n", "\n", "| Physicochemical properties | Array position | Example |\n", "|:-----------------------------|---------------:|--------:|\n", "| alcohol | 0 | 15.0 |\n", "| malic_acid | 1 | 1.7 |\n", "| ash | 2 | 2.1 |\n", "| alcalinity_of_ash | 3 | 15.0 |\n", "| magnesium | 4 | 105 |\n", "| total_phenols | 5 | 2.3 |\n", "| flavanoids | 6 | 1.32 |\n", "| nonflavanoid_phenols | 7 | 0.5 |\n", "| proanthocyanins | 8 | 2.0 |\n", "| color_intensity | 9 | 3.9 |\n", "| hue | 10 | 1.1 |\n", "| od280/od315_of_diluted_wines | 11 | 3.0 |\n", "| proline | 12 | 890 |\n", "\n", "The following code cell shows the class of a wine that has the physicochemical properties in the example:\n" ], "metadata": { "collapsed": false } }, { "cell_type": "code", "execution_count": null, "outputs": [], "source": [ "example = [[15.0, 1.7, 2.1, 15.0, 105, 2.3, 1.32, 0.5, 2.0, 3.9, 1.1, 3.0, 890]]\n", "example_class = clf_model.predict(example)\n", "print(example_class)" ], "metadata": { "collapsed": false } }, { "cell_type": "markdown", "source": [ "## Questions for analysis\n", "1. Now that you have trained the model, you can use the ```predict``` method to get the category of a new wine. Use this method to get the category of the wonderful Casa Quemada (CQ) from Viña Elena´s winerie, given its physicochemical properties: \n", "\n", "| Physicochemical properties | CQ |\n", "|:-----------------------------|-------:|\n", "| alcohol | 14.38 |\n", "| malic_acid | 1.83 |\n", "| ash | 2.36 |\n", "| alcalinity_of_ash | 17.2 |\n", "| magnesium | 104 |\n", "| total_phenols | 2.42 |\n", "| flavanoids | 1.39 |\n", "| nonflavanoid_phenols | 0.42 |\n", "| proanthocyanins | 1.97 |\n", "| color_intensity | 3.84 |\n", "| hue | 1.23 |\n", "| od280/od315_of_diluted_wines | 2.87 |\n", "| proline | 990 |" ], "metadata": { "id": "fmYlEEYcudtI" } }, { "cell_type": "code", "source": [ "# Enter the physicochemical properties of the wine you would like to test, in order and using commas to separate the values\n", "cq = [[]]\n", "cq_class = clf_model.predict(cq)\n", "print(cq_class)\n" ], "metadata": { "id": "gSRNV3GGvFCu" }, "execution_count": null, "outputs": [] }, { "cell_type": "markdown", "source": [], "metadata": { "id": "u2tiIBjI8BRk" } }, { "cell_type": "markdown", "source": [ "How good is the wine? Now look at the decision rules in the tree and solve the tree manually. Do you get the same result?" ], "metadata": { "id": "OfOBrtbEz67o" } }, { "cell_type": "markdown", "source": [ "2. The confusion matrix shows the errors made by the model, whereas the accuracy is just a metric of the number of errors. Imagine that you use the different categories to guide your marketing policies, and that you will invest more money in the marketing of wines you expect will have better ratings (being class 2 the category of best rated wines) more than in wines with lower expectations. Do you think that the confusion matrix provides valuable information for analysis?" ], "metadata": { "id": "NSEeYkrswRFR" } }, { "cell_type": "markdown", "source": [], "metadata": { "id": "4c9bpcwfxbo_" } }, { "cell_type": "markdown", "source": [ "3. The accuracy is just one out of different metrics used to evaluate machine learning models. Another interesting metric is called precision, and is also implemented in SKLearn. You can check the docs in this [link](https://scikit-learn.org/stable/modules/generated/sklearn.metrics.precision_score.html#sklearn.metrics.precision_score). Based on your response to the previous question, do you think that the precision is a relevant metric in this use case scenario?" ], "metadata": { "id": "DnIjC_Bdxc4h" } }, { "cell_type": "markdown", "source": [ "4. Run the experiment again with different sizes of the test data (e.g. 20% and 40%). Recall the concepts of overfitting and underfitting and note what happens with the accuracy. What are your conclusions?" ], "metadata": { "id": "DGFzaRLy8FKE" } }, { "cell_type": "markdown", "source": [ "5. Look now to the right hand of the decision tree. Looking to the left, it would be interesting to plot the proline against the malic acid. Check the code cells used to render some properties against the color intensity to plot the proline against the malic acid for a. all wines, b. only wines in classes 0 and 1 c. wines where the color intensity is greater than 3.82 and flavanoids greater than 1.4." ], "metadata": { "id": "KXlW8VlPy3M4" } }, { "cell_type": "markdown", "source": [ "6. SKLearn has other [datasets](https://scikit-learn.org/stable/datasets.html) you can use to step up your machine learning skills. Do you dare to train a model for a different training dataset?\n" ], "metadata": { "id": "YhGmaV5J4IfY" } } ] }